package 笔试.暑期2023.腾讯音乐2022_暑期招聘;

import java.util.*;

/**
 * 优先队列的使用
 *
 * 小红拿到了一个数组 a，每次操作小红可以选择数组中的任意一个数减去 x，小红一共能进行 k 次。
 * 小红想在 k 次操作之后，数组的最大值尽可能小。请你返回这个最大值。
 */
public class T2_Solution {
    public int minMax(ArrayList<Integer> a, int k, int x) {

        // 定义 优先级队列（大顶堆），并初始化
        PriorityQueue<Integer> queue = new PriorityQueue<>((o1, o2) -> o2 - o1); //后减前，表示降序
        for (Integer num : a) {
            queue.offer(num);
        }

        for (int i = 0; i < k; i++) {
            Integer num1 = queue.poll(); //每次取出的元素都是队列中最大的
            queue.offer(num1 - x);
        }
        return queue.peek();//弹出顶部的（最大的）
    }

    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(2);
        list.add(1);
        list.add(3);
        System.out.println(new T2_Solution().minMax(list, 2, 1));
    }
}